/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package controladores;

import controladores.exceptions.IllegalOrphanException;
import controladores.exceptions.NonexistentEntityException;
import controladores.exceptions.PreexistingEntityException;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Query;
import javax.persistence.EntityNotFoundException;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;
import entidades.Unidadorganizacional;
import entidades.Tipo;
import entidades.Quien;
import entidades.Persona;
import entidades.Pais;
import entidades.Registro;
import entidades.Rol;
import java.util.ArrayList;
import java.util.List;
import entidades.Premios;
import entidades.Programacion;
import entidades.Estudiopersona;
import entidades.Carta;
import entidades.Libros;
import entidades.Items;
import entidades.Articulo;
import entidades.Actividades;

/**
 *
 * @author Andres
 */
public class PersonaJpaController {

    public PersonaJpaController() {
        emf = Persistence.createEntityManagerFactory("proyectoCongresoPU");
    }
    private EntityManagerFactory emf = null;

    public EntityManager getEntityManager() {
        return emf.createEntityManager();
    }

    public void create(Persona persona) throws IllegalOrphanException, PreexistingEntityException, Exception {
        if (persona.getRolList() == null) {
            persona.setRolList(new ArrayList<Rol>());
        }
        if (persona.getPremiosList() == null) {
            persona.setPremiosList(new ArrayList<Premios>());
        }
        if (persona.getPersonaList() == null) {
            persona.setPersonaList(new ArrayList<Persona>());
        }
        if (persona.getProgramacionList() == null) {
            persona.setProgramacionList(new ArrayList<Programacion>());
        }
        if (persona.getEstudiopersonaList() == null) {
            persona.setEstudiopersonaList(new ArrayList<Estudiopersona>());
        }
        if (persona.getCartaList() == null) {
            persona.setCartaList(new ArrayList<Carta>());
        }
        if (persona.getLibrosList() == null) {
            persona.setLibrosList(new ArrayList<Libros>());
        }
        if (persona.getItemsList() == null) {
            persona.setItemsList(new ArrayList<Items>());
        }
        if (persona.getArticuloList() == null) {
            persona.setArticuloList(new ArrayList<Articulo>());
        }
        if (persona.getActividadesList() == null) {
            persona.setActividadesList(new ArrayList<Actividades>());
        }
        List<String> illegalOrphanMessages = null;
        Quien quienOrphanCheck = persona.getQuien();
        if (quienOrphanCheck != null) {
            Persona oldPersonaOfQuien = quienOrphanCheck.getPersona();
            if (oldPersonaOfQuien != null) {
                if (illegalOrphanMessages == null) {
                    illegalOrphanMessages = new ArrayList<String>();
                }
                illegalOrphanMessages.add("The Quien " + quienOrphanCheck + " already has an item of type Persona whose quien column cannot be null. Please make another selection for the quien field.");
            }
        }
        if (illegalOrphanMessages != null) {
            throw new IllegalOrphanException(illegalOrphanMessages);
        }
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Unidadorganizacional unidadorganizacional = persona.getUnidadorganizacional();
            if (unidadorganizacional != null) {
                unidadorganizacional = em.getReference(unidadorganizacional.getClass(), unidadorganizacional.getCodigounidad());
                persona.setUnidadorganizacional(unidadorganizacional);
            }
            Tipo tipo = persona.getTipo();
            if (tipo != null) {
                tipo = em.getReference(tipo.getClass(), tipo.getIdtipo());
                persona.setTipo(tipo);
            }
            Quien quien = persona.getQuien();
            if (quien != null) {
                quien = em.getReference(quien.getClass(), quien.getCodigo());
                persona.setQuien(quien);
            }
            Persona personaRel = persona.getPersona();
            if (personaRel != null) {
                personaRel = em.getReference(persona.getClass(), persona.getCodigopersona());
                persona.setPersona(personaRel);
            }
            Pais pais = persona.getPais();
            if (pais != null) {
                pais = em.getReference(pais.getClass(), pais.getCodigo());
                persona.setPais(pais);
            }
            Registro registro1 = persona.getRegistro1();
            if (registro1 != null) {
                registro1 = em.getReference(registro1.getClass(), registro1.getCodigo());
                persona.setRegistro1(registro1);
            }
            List<Rol> attachedRolList = new ArrayList<Rol>();
            for (Rol rolListRolToAttach : persona.getRolList()) {
                rolListRolToAttach = em.getReference(rolListRolToAttach.getClass(), rolListRolToAttach.getCodigo());
                attachedRolList.add(rolListRolToAttach);
            }
            persona.setRolList(attachedRolList);
            List<Premios> attachedPremiosList = new ArrayList<Premios>();
            for (Premios premiosListPremiosToAttach : persona.getPremiosList()) {
                premiosListPremiosToAttach = em.getReference(premiosListPremiosToAttach.getClass(), premiosListPremiosToAttach.getCodigo());
                attachedPremiosList.add(premiosListPremiosToAttach);
            }
            persona.setPremiosList(attachedPremiosList);
            List<Persona> attachedPersonaList = new ArrayList<Persona>();
            for (Persona personaListPersonaToAttach : persona.getPersonaList()) {
                personaListPersonaToAttach = em.getReference(personaListPersonaToAttach.getClass(), personaListPersonaToAttach.getCodigopersona());
                attachedPersonaList.add(personaListPersonaToAttach);
            }
            persona.setPersonaList(attachedPersonaList);
            List<Programacion> attachedProgramacionList = new ArrayList<Programacion>();
            for (Programacion programacionListProgramacionToAttach : persona.getProgramacionList()) {
                programacionListProgramacionToAttach = em.getReference(programacionListProgramacionToAttach.getClass(), programacionListProgramacionToAttach.getCodigoprogramacion());
                attachedProgramacionList.add(programacionListProgramacionToAttach);
            }
            persona.setProgramacionList(attachedProgramacionList);
            List<Estudiopersona> attachedEstudiopersonaList = new ArrayList<Estudiopersona>();
            for (Estudiopersona estudiopersonaListEstudiopersonaToAttach : persona.getEstudiopersonaList()) {
                estudiopersonaListEstudiopersonaToAttach = em.getReference(estudiopersonaListEstudiopersonaToAttach.getClass(), estudiopersonaListEstudiopersonaToAttach.getEstudiopersonaPK());
                attachedEstudiopersonaList.add(estudiopersonaListEstudiopersonaToAttach);
            }
            persona.setEstudiopersonaList(attachedEstudiopersonaList);
            List<Carta> attachedCartaList = new ArrayList<Carta>();
            for (Carta cartaListCartaToAttach : persona.getCartaList()) {
                cartaListCartaToAttach = em.getReference(cartaListCartaToAttach.getClass(), cartaListCartaToAttach.getCodradicacion());
                attachedCartaList.add(cartaListCartaToAttach);
            }
            persona.setCartaList(attachedCartaList);
            List<Libros> attachedLibrosList = new ArrayList<Libros>();
            for (Libros librosListLibrosToAttach : persona.getLibrosList()) {
                librosListLibrosToAttach = em.getReference(librosListLibrosToAttach.getClass(), librosListLibrosToAttach.getCodigo());
                attachedLibrosList.add(librosListLibrosToAttach);
            }
            persona.setLibrosList(attachedLibrosList);
            List<Items> attachedItemsList = new ArrayList<Items>();
            for (Items itemsListItemsToAttach : persona.getItemsList()) {
                itemsListItemsToAttach = em.getReference(itemsListItemsToAttach.getClass(), itemsListItemsToAttach.getIditem());
                attachedItemsList.add(itemsListItemsToAttach);
            }
            persona.setItemsList(attachedItemsList);
            List<Articulo> attachedArticuloList = new ArrayList<Articulo>();
            for (Articulo articuloListArticuloToAttach : persona.getArticuloList()) {
                articuloListArticuloToAttach = em.getReference(articuloListArticuloToAttach.getClass(), articuloListArticuloToAttach.getCodigo());
                attachedArticuloList.add(articuloListArticuloToAttach);
            }
            persona.setArticuloList(attachedArticuloList);
            List<Actividades> attachedActividadesList = new ArrayList<Actividades>();
            for (Actividades actividadesListActividadesToAttach : persona.getActividadesList()) {
                actividadesListActividadesToAttach = em.getReference(actividadesListActividadesToAttach.getClass(), actividadesListActividadesToAttach.getCodigo());
                attachedActividadesList.add(actividadesListActividadesToAttach);
            }
            persona.setActividadesList(attachedActividadesList);
            em.persist(persona);
            if (unidadorganizacional != null) {
                unidadorganizacional.getPersonaList().add(persona);
                unidadorganizacional = em.merge(unidadorganizacional);
            }
            if (tipo != null) {
                tipo.getPersonaList().add(persona);
                tipo = em.merge(tipo);
            }
            if (quien != null) {
                quien.setPersona(persona);
                quien = em.merge(quien);
            }
            if (personaRel != null) {
                personaRel.getPersonaList().add(persona);
                personaRel = em.merge(personaRel);
            }
            if (pais != null) {
                pais.getPersonaList().add(persona);
                pais = em.merge(pais);
            }
            if (registro1 != null) {
                Persona oldPersonaOfRegistro1 = registro1.getPersona();
                if (oldPersonaOfRegistro1 != null) {
                    oldPersonaOfRegistro1.setRegistro1(null);
                    oldPersonaOfRegistro1 = em.merge(oldPersonaOfRegistro1);
                }
                registro1.setPersona(persona);
                registro1 = em.merge(registro1);
            }
            for (Rol rolListRol : persona.getRolList()) {
                rolListRol.getPersonaList().add(persona);
                rolListRol = em.merge(rolListRol);
            }
            for (Premios premiosListPremios : persona.getPremiosList()) {
                premiosListPremios.getPersonaList().add(persona);
                premiosListPremios = em.merge(premiosListPremios);
            }
            for (Persona personaListPersona : persona.getPersonaList()) {
                Persona oldPersonaOfPersonaListPersona = personaListPersona.getPersona();
                personaListPersona.setPersona(persona);
                personaListPersona = em.merge(personaListPersona);
                if (oldPersonaOfPersonaListPersona != null) {
                    oldPersonaOfPersonaListPersona.getPersonaList().remove(personaListPersona);
                    oldPersonaOfPersonaListPersona = em.merge(oldPersonaOfPersonaListPersona);
                }
            }
            for (Programacion programacionListProgramacion : persona.getProgramacionList()) {
                Persona oldPersonaOfProgramacionListProgramacion = programacionListProgramacion.getPersona();
                programacionListProgramacion.setPersona(persona);
                programacionListProgramacion = em.merge(programacionListProgramacion);
                if (oldPersonaOfProgramacionListProgramacion != null) {
                    oldPersonaOfProgramacionListProgramacion.getProgramacionList().remove(programacionListProgramacion);
                    oldPersonaOfProgramacionListProgramacion = em.merge(oldPersonaOfProgramacionListProgramacion);
                }
            }
            for (Estudiopersona estudiopersonaListEstudiopersona : persona.getEstudiopersonaList()) {
                Persona oldPersonaOfEstudiopersonaListEstudiopersona = estudiopersonaListEstudiopersona.getPersona();
                estudiopersonaListEstudiopersona.setPersona(persona);
                estudiopersonaListEstudiopersona = em.merge(estudiopersonaListEstudiopersona);
                if (oldPersonaOfEstudiopersonaListEstudiopersona != null) {
                    oldPersonaOfEstudiopersonaListEstudiopersona.getEstudiopersonaList().remove(estudiopersonaListEstudiopersona);
                    oldPersonaOfEstudiopersonaListEstudiopersona = em.merge(oldPersonaOfEstudiopersonaListEstudiopersona);
                }
            }
            for (Carta cartaListCarta : persona.getCartaList()) {
                Persona oldPersonaOfCartaListCarta = cartaListCarta.getPersona();
                cartaListCarta.setPersona(persona);
                cartaListCarta = em.merge(cartaListCarta);
                if (oldPersonaOfCartaListCarta != null) {
                    oldPersonaOfCartaListCarta.getCartaList().remove(cartaListCarta);
                    oldPersonaOfCartaListCarta = em.merge(oldPersonaOfCartaListCarta);
                }
            }
            for (Libros librosListLibros : persona.getLibrosList()) {
                Persona oldPersonaOfLibrosListLibros = librosListLibros.getPersona();
                librosListLibros.setPersona(persona);
                librosListLibros = em.merge(librosListLibros);
                if (oldPersonaOfLibrosListLibros != null) {
                    oldPersonaOfLibrosListLibros.getLibrosList().remove(librosListLibros);
                    oldPersonaOfLibrosListLibros = em.merge(oldPersonaOfLibrosListLibros);
                }
            }
            for (Items itemsListItems : persona.getItemsList()) {
                Persona oldPersonaOfItemsListItems = itemsListItems.getPersona();
                itemsListItems.setPersona(persona);
                itemsListItems = em.merge(itemsListItems);
                if (oldPersonaOfItemsListItems != null) {
                    oldPersonaOfItemsListItems.getItemsList().remove(itemsListItems);
                    oldPersonaOfItemsListItems = em.merge(oldPersonaOfItemsListItems);
                }
            }
            for (Articulo articuloListArticulo : persona.getArticuloList()) {
                Persona oldPersonaOfArticuloListArticulo = articuloListArticulo.getPersona();
                articuloListArticulo.setPersona(persona);
                articuloListArticulo = em.merge(articuloListArticulo);
                if (oldPersonaOfArticuloListArticulo != null) {
                    oldPersonaOfArticuloListArticulo.getArticuloList().remove(articuloListArticulo);
                    oldPersonaOfArticuloListArticulo = em.merge(oldPersonaOfArticuloListArticulo);
                }
            }
            for (Actividades actividadesListActividades : persona.getActividadesList()) {
                Persona oldPersonaOfActividadesListActividades = actividadesListActividades.getPersona();
                actividadesListActividades.setPersona(persona);
                actividadesListActividades = em.merge(actividadesListActividades);
                if (oldPersonaOfActividadesListActividades != null) {
                    oldPersonaOfActividadesListActividades.getActividadesList().remove(actividadesListActividades);
                    oldPersonaOfActividadesListActividades = em.merge(oldPersonaOfActividadesListActividades);
                }
            }
            em.getTransaction().commit();
        } catch (Exception ex) {
            if (findPersona(persona.getCodigopersona()) != null) {
                throw new PreexistingEntityException("Persona " + persona + " already exists.", ex);
            }
            throw ex;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void edit(Persona persona) throws IllegalOrphanException, NonexistentEntityException, Exception {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Persona persistentPersona = em.find(Persona.class, persona.getCodigopersona());
            Unidadorganizacional unidadorganizacionalOld = persistentPersona.getUnidadorganizacional();
            Unidadorganizacional unidadorganizacionalNew = persona.getUnidadorganizacional();
            Tipo tipoOld = persistentPersona.getTipo();
            Tipo tipoNew = persona.getTipo();
            Quien quienOld = persistentPersona.getQuien();
            Quien quienNew = persona.getQuien();
            Persona personaRelOld = persistentPersona.getPersona();
            Persona personaRelNew = persona.getPersona();
            Pais paisOld = persistentPersona.getPais();
            Pais paisNew = persona.getPais();
            Registro registro1Old = persistentPersona.getRegistro1();
            Registro registro1New = persona.getRegistro1();
            List<Rol> rolListOld = persistentPersona.getRolList();
            List<Rol> rolListNew = persona.getRolList();
            List<Premios> premiosListOld = persistentPersona.getPremiosList();
            List<Premios> premiosListNew = persona.getPremiosList();
            List<Persona> personaListOld = persistentPersona.getPersonaList();
            List<Persona> personaListNew = persona.getPersonaList();
            List<Programacion> programacionListOld = persistentPersona.getProgramacionList();
            List<Programacion> programacionListNew = persona.getProgramacionList();
            List<Estudiopersona> estudiopersonaListOld = persistentPersona.getEstudiopersonaList();
            List<Estudiopersona> estudiopersonaListNew = persona.getEstudiopersonaList();
            List<Carta> cartaListOld = persistentPersona.getCartaList();
            List<Carta> cartaListNew = persona.getCartaList();
            List<Libros> librosListOld = persistentPersona.getLibrosList();
            List<Libros> librosListNew = persona.getLibrosList();
            List<Items> itemsListOld = persistentPersona.getItemsList();
            List<Items> itemsListNew = persona.getItemsList();
            List<Articulo> articuloListOld = persistentPersona.getArticuloList();
            List<Articulo> articuloListNew = persona.getArticuloList();
            List<Actividades> actividadesListOld = persistentPersona.getActividadesList();
            List<Actividades> actividadesListNew = persona.getActividadesList();
            List<String> illegalOrphanMessages = null;
            if (quienNew != null && !quienNew.equals(quienOld)) {
                Persona oldPersonaOfQuien = quienNew.getPersona();
                if (oldPersonaOfQuien != null) {
                    if (illegalOrphanMessages == null) {
                        illegalOrphanMessages = new ArrayList<String>();
                    }
                    illegalOrphanMessages.add("The Quien " + quienNew + " already has an item of type Persona whose quien column cannot be null. Please make another selection for the quien field.");
                }
            }
            for (Estudiopersona estudiopersonaListOldEstudiopersona : estudiopersonaListOld) {
                if (!estudiopersonaListNew.contains(estudiopersonaListOldEstudiopersona)) {
                    if (illegalOrphanMessages == null) {
                        illegalOrphanMessages = new ArrayList<String>();
                    }
                    illegalOrphanMessages.add("You must retain Estudiopersona " + estudiopersonaListOldEstudiopersona + " since its persona field is not nullable.");
                }
            }
            for (Carta cartaListOldCarta : cartaListOld) {
                if (!cartaListNew.contains(cartaListOldCarta)) {
                    if (illegalOrphanMessages == null) {
                        illegalOrphanMessages = new ArrayList<String>();
                    }
                    illegalOrphanMessages.add("You must retain Carta " + cartaListOldCarta + " since its persona field is not nullable.");
                }
            }
            for (Libros librosListOldLibros : librosListOld) {
                if (!librosListNew.contains(librosListOldLibros)) {
                    if (illegalOrphanMessages == null) {
                        illegalOrphanMessages = new ArrayList<String>();
                    }
                    illegalOrphanMessages.add("You must retain Libros " + librosListOldLibros + " since its persona field is not nullable.");
                }
            }
            for (Items itemsListOldItems : itemsListOld) {
                if (!itemsListNew.contains(itemsListOldItems)) {
                    if (illegalOrphanMessages == null) {
                        illegalOrphanMessages = new ArrayList<String>();
                    }
                    illegalOrphanMessages.add("You must retain Items " + itemsListOldItems + " since its persona field is not nullable.");
                }
            }
            for (Articulo articuloListOldArticulo : articuloListOld) {
                if (!articuloListNew.contains(articuloListOldArticulo)) {
                    if (illegalOrphanMessages == null) {
                        illegalOrphanMessages = new ArrayList<String>();
                    }
                    illegalOrphanMessages.add("You must retain Articulo " + articuloListOldArticulo + " since its persona field is not nullable.");
                }
            }
            for (Actividades actividadesListOldActividades : actividadesListOld) {
                if (!actividadesListNew.contains(actividadesListOldActividades)) {
                    if (illegalOrphanMessages == null) {
                        illegalOrphanMessages = new ArrayList<String>();
                    }
                    illegalOrphanMessages.add("You must retain Actividades " + actividadesListOldActividades + " since its persona field is not nullable.");
                }
            }
            if (illegalOrphanMessages != null) {
                throw new IllegalOrphanException(illegalOrphanMessages);
            }
            if (unidadorganizacionalNew != null) {
                unidadorganizacionalNew = em.getReference(unidadorganizacionalNew.getClass(), unidadorganizacionalNew.getCodigounidad());
                persona.setUnidadorganizacional(unidadorganizacionalNew);
            }
            if (tipoNew != null) {
                tipoNew = em.getReference(tipoNew.getClass(), tipoNew.getIdtipo());
                persona.setTipo(tipoNew);
            }
            if (quienNew != null) {
                quienNew = em.getReference(quienNew.getClass(), quienNew.getCodigo());
                persona.setQuien(quienNew);
            }
            if (personaRelNew != null) {
                personaRelNew = em.getReference(personaRelNew.getClass(), personaRelNew.getCodigopersona());
                persona.setPersona(personaRelNew);
            }
            if (paisNew != null) {
                paisNew = em.getReference(paisNew.getClass(), paisNew.getCodigo());
                persona.setPais(paisNew);
            }
            if (registro1New != null) {
                registro1New = em.getReference(registro1New.getClass(), registro1New.getCodigo());
                persona.setRegistro1(registro1New);
            }
            List<Rol> attachedRolListNew = new ArrayList<Rol>();
            for (Rol rolListNewRolToAttach : rolListNew) {
                rolListNewRolToAttach = em.getReference(rolListNewRolToAttach.getClass(), rolListNewRolToAttach.getCodigo());
                attachedRolListNew.add(rolListNewRolToAttach);
            }
            rolListNew = attachedRolListNew;
            persona.setRolList(rolListNew);
            List<Premios> attachedPremiosListNew = new ArrayList<Premios>();
            for (Premios premiosListNewPremiosToAttach : premiosListNew) {
                premiosListNewPremiosToAttach = em.getReference(premiosListNewPremiosToAttach.getClass(), premiosListNewPremiosToAttach.getCodigo());
                attachedPremiosListNew.add(premiosListNewPremiosToAttach);
            }
            premiosListNew = attachedPremiosListNew;
            persona.setPremiosList(premiosListNew);
            List<Persona> attachedPersonaListNew = new ArrayList<Persona>();
            for (Persona personaListNewPersonaToAttach : personaListNew) {
                personaListNewPersonaToAttach = em.getReference(personaListNewPersonaToAttach.getClass(), personaListNewPersonaToAttach.getCodigopersona());
                attachedPersonaListNew.add(personaListNewPersonaToAttach);
            }
            personaListNew = attachedPersonaListNew;
            persona.setPersonaList(personaListNew);
            List<Programacion> attachedProgramacionListNew = new ArrayList<Programacion>();
            for (Programacion programacionListNewProgramacionToAttach : programacionListNew) {
                programacionListNewProgramacionToAttach = em.getReference(programacionListNewProgramacionToAttach.getClass(), programacionListNewProgramacionToAttach.getCodigoprogramacion());
                attachedProgramacionListNew.add(programacionListNewProgramacionToAttach);
            }
            programacionListNew = attachedProgramacionListNew;
            persona.setProgramacionList(programacionListNew);
            List<Estudiopersona> attachedEstudiopersonaListNew = new ArrayList<Estudiopersona>();
            for (Estudiopersona estudiopersonaListNewEstudiopersonaToAttach : estudiopersonaListNew) {
                estudiopersonaListNewEstudiopersonaToAttach = em.getReference(estudiopersonaListNewEstudiopersonaToAttach.getClass(), estudiopersonaListNewEstudiopersonaToAttach.getEstudiopersonaPK());
                attachedEstudiopersonaListNew.add(estudiopersonaListNewEstudiopersonaToAttach);
            }
            estudiopersonaListNew = attachedEstudiopersonaListNew;
            persona.setEstudiopersonaList(estudiopersonaListNew);
            List<Carta> attachedCartaListNew = new ArrayList<Carta>();
            for (Carta cartaListNewCartaToAttach : cartaListNew) {
                cartaListNewCartaToAttach = em.getReference(cartaListNewCartaToAttach.getClass(), cartaListNewCartaToAttach.getCodradicacion());
                attachedCartaListNew.add(cartaListNewCartaToAttach);
            }
            cartaListNew = attachedCartaListNew;
            persona.setCartaList(cartaListNew);
            List<Libros> attachedLibrosListNew = new ArrayList<Libros>();
            for (Libros librosListNewLibrosToAttach : librosListNew) {
                librosListNewLibrosToAttach = em.getReference(librosListNewLibrosToAttach.getClass(), librosListNewLibrosToAttach.getCodigo());
                attachedLibrosListNew.add(librosListNewLibrosToAttach);
            }
            librosListNew = attachedLibrosListNew;
            persona.setLibrosList(librosListNew);
            List<Items> attachedItemsListNew = new ArrayList<Items>();
            for (Items itemsListNewItemsToAttach : itemsListNew) {
                itemsListNewItemsToAttach = em.getReference(itemsListNewItemsToAttach.getClass(), itemsListNewItemsToAttach.getIditem());
                attachedItemsListNew.add(itemsListNewItemsToAttach);
            }
            itemsListNew = attachedItemsListNew;
            persona.setItemsList(itemsListNew);
            List<Articulo> attachedArticuloListNew = new ArrayList<Articulo>();
            for (Articulo articuloListNewArticuloToAttach : articuloListNew) {
                articuloListNewArticuloToAttach = em.getReference(articuloListNewArticuloToAttach.getClass(), articuloListNewArticuloToAttach.getCodigo());
                attachedArticuloListNew.add(articuloListNewArticuloToAttach);
            }
            articuloListNew = attachedArticuloListNew;
            persona.setArticuloList(articuloListNew);
            List<Actividades> attachedActividadesListNew = new ArrayList<Actividades>();
            for (Actividades actividadesListNewActividadesToAttach : actividadesListNew) {
                actividadesListNewActividadesToAttach = em.getReference(actividadesListNewActividadesToAttach.getClass(), actividadesListNewActividadesToAttach.getCodigo());
                attachedActividadesListNew.add(actividadesListNewActividadesToAttach);
            }
            actividadesListNew = attachedActividadesListNew;
            persona.setActividadesList(actividadesListNew);
            persona = em.merge(persona);
            if (unidadorganizacionalOld != null && !unidadorganizacionalOld.equals(unidadorganizacionalNew)) {
                unidadorganizacionalOld.getPersonaList().remove(persona);
                unidadorganizacionalOld = em.merge(unidadorganizacionalOld);
            }
            if (unidadorganizacionalNew != null && !unidadorganizacionalNew.equals(unidadorganizacionalOld)) {
                unidadorganizacionalNew.getPersonaList().add(persona);
                unidadorganizacionalNew = em.merge(unidadorganizacionalNew);
            }
            if (tipoOld != null && !tipoOld.equals(tipoNew)) {
                tipoOld.getPersonaList().remove(persona);
                tipoOld = em.merge(tipoOld);
            }
            if (tipoNew != null && !tipoNew.equals(tipoOld)) {
                tipoNew.getPersonaList().add(persona);
                tipoNew = em.merge(tipoNew);
            }
            if (quienOld != null && !quienOld.equals(quienNew)) {
                quienOld.setPersona(null);
                quienOld = em.merge(quienOld);
            }
            if (quienNew != null && !quienNew.equals(quienOld)) {
                quienNew.setPersona(persona);
                quienNew = em.merge(quienNew);
            }
            if (personaRelOld != null && !personaRelOld.equals(personaRelNew)) {
                personaRelOld.getPersonaList().remove(persona);
                personaRelOld = em.merge(personaRelOld);
            }
            if (personaRelNew != null && !personaRelNew.equals(personaRelOld)) {
                personaRelNew.getPersonaList().add(persona);
                personaRelNew = em.merge(personaRelNew);
            }
            if (paisOld != null && !paisOld.equals(paisNew)) {
                paisOld.getPersonaList().remove(persona);
                paisOld = em.merge(paisOld);
            }
            if (paisNew != null && !paisNew.equals(paisOld)) {
                paisNew.getPersonaList().add(persona);
                paisNew = em.merge(paisNew);
            }
            if (registro1Old != null && !registro1Old.equals(registro1New)) {
                registro1Old.setPersona(null);
                registro1Old = em.merge(registro1Old);
            }
            if (registro1New != null && !registro1New.equals(registro1Old)) {
                Persona oldPersonaOfRegistro1 = registro1New.getPersona();
                if (oldPersonaOfRegistro1 != null) {
                    oldPersonaOfRegistro1.setRegistro1(null);
                    oldPersonaOfRegistro1 = em.merge(oldPersonaOfRegistro1);
                }
                registro1New.setPersona(persona);
                registro1New = em.merge(registro1New);
            }
            for (Rol rolListOldRol : rolListOld) {
                if (!rolListNew.contains(rolListOldRol)) {
                    rolListOldRol.getPersonaList().remove(persona);
                    rolListOldRol = em.merge(rolListOldRol);
                }
            }
            for (Rol rolListNewRol : rolListNew) {
                if (!rolListOld.contains(rolListNewRol)) {
                    rolListNewRol.getPersonaList().add(persona);
                    rolListNewRol = em.merge(rolListNewRol);
                }
            }
            for (Premios premiosListOldPremios : premiosListOld) {
                if (!premiosListNew.contains(premiosListOldPremios)) {
                    premiosListOldPremios.getPersonaList().remove(persona);
                    premiosListOldPremios = em.merge(premiosListOldPremios);
                }
            }
            for (Premios premiosListNewPremios : premiosListNew) {
                if (!premiosListOld.contains(premiosListNewPremios)) {
                    premiosListNewPremios.getPersonaList().add(persona);
                    premiosListNewPremios = em.merge(premiosListNewPremios);
                }
            }
            for (Persona personaListOldPersona : personaListOld) {
                if (!personaListNew.contains(personaListOldPersona)) {
                    personaListOldPersona.setPersona(null);
                    personaListOldPersona = em.merge(personaListOldPersona);
                }
            }
            for (Persona personaListNewPersona : personaListNew) {
                if (!personaListOld.contains(personaListNewPersona)) {
                    Persona oldPersonaOfPersonaListNewPersona = personaListNewPersona.getPersona();
                    personaListNewPersona.setPersona(persona);
                    personaListNewPersona = em.merge(personaListNewPersona);
                    if (oldPersonaOfPersonaListNewPersona != null && !oldPersonaOfPersonaListNewPersona.equals(persona)) {
                        oldPersonaOfPersonaListNewPersona.getPersonaList().remove(personaListNewPersona);
                        oldPersonaOfPersonaListNewPersona = em.merge(oldPersonaOfPersonaListNewPersona);
                    }
                }
            }
            for (Programacion programacionListOldProgramacion : programacionListOld) {
                if (!programacionListNew.contains(programacionListOldProgramacion)) {
                    programacionListOldProgramacion.setPersona(null);
                    programacionListOldProgramacion = em.merge(programacionListOldProgramacion);
                }
            }
            for (Programacion programacionListNewProgramacion : programacionListNew) {
                if (!programacionListOld.contains(programacionListNewProgramacion)) {
                    Persona oldPersonaOfProgramacionListNewProgramacion = programacionListNewProgramacion.getPersona();
                    programacionListNewProgramacion.setPersona(persona);
                    programacionListNewProgramacion = em.merge(programacionListNewProgramacion);
                    if (oldPersonaOfProgramacionListNewProgramacion != null && !oldPersonaOfProgramacionListNewProgramacion.equals(persona)) {
                        oldPersonaOfProgramacionListNewProgramacion.getProgramacionList().remove(programacionListNewProgramacion);
                        oldPersonaOfProgramacionListNewProgramacion = em.merge(oldPersonaOfProgramacionListNewProgramacion);
                    }
                }
            }
            for (Estudiopersona estudiopersonaListNewEstudiopersona : estudiopersonaListNew) {
                if (!estudiopersonaListOld.contains(estudiopersonaListNewEstudiopersona)) {
                    Persona oldPersonaOfEstudiopersonaListNewEstudiopersona = estudiopersonaListNewEstudiopersona.getPersona();
                    estudiopersonaListNewEstudiopersona.setPersona(persona);
                    estudiopersonaListNewEstudiopersona = em.merge(estudiopersonaListNewEstudiopersona);
                    if (oldPersonaOfEstudiopersonaListNewEstudiopersona != null && !oldPersonaOfEstudiopersonaListNewEstudiopersona.equals(persona)) {
                        oldPersonaOfEstudiopersonaListNewEstudiopersona.getEstudiopersonaList().remove(estudiopersonaListNewEstudiopersona);
                        oldPersonaOfEstudiopersonaListNewEstudiopersona = em.merge(oldPersonaOfEstudiopersonaListNewEstudiopersona);
                    }
                }
            }
            for (Carta cartaListNewCarta : cartaListNew) {
                if (!cartaListOld.contains(cartaListNewCarta)) {
                    Persona oldPersonaOfCartaListNewCarta = cartaListNewCarta.getPersona();
                    cartaListNewCarta.setPersona(persona);
                    cartaListNewCarta = em.merge(cartaListNewCarta);
                    if (oldPersonaOfCartaListNewCarta != null && !oldPersonaOfCartaListNewCarta.equals(persona)) {
                        oldPersonaOfCartaListNewCarta.getCartaList().remove(cartaListNewCarta);
                        oldPersonaOfCartaListNewCarta = em.merge(oldPersonaOfCartaListNewCarta);
                    }
                }
            }
            for (Libros librosListNewLibros : librosListNew) {
                if (!librosListOld.contains(librosListNewLibros)) {
                    Persona oldPersonaOfLibrosListNewLibros = librosListNewLibros.getPersona();
                    librosListNewLibros.setPersona(persona);
                    librosListNewLibros = em.merge(librosListNewLibros);
                    if (oldPersonaOfLibrosListNewLibros != null && !oldPersonaOfLibrosListNewLibros.equals(persona)) {
                        oldPersonaOfLibrosListNewLibros.getLibrosList().remove(librosListNewLibros);
                        oldPersonaOfLibrosListNewLibros = em.merge(oldPersonaOfLibrosListNewLibros);
                    }
                }
            }
            for (Items itemsListNewItems : itemsListNew) {
                if (!itemsListOld.contains(itemsListNewItems)) {
                    Persona oldPersonaOfItemsListNewItems = itemsListNewItems.getPersona();
                    itemsListNewItems.setPersona(persona);
                    itemsListNewItems = em.merge(itemsListNewItems);
                    if (oldPersonaOfItemsListNewItems != null && !oldPersonaOfItemsListNewItems.equals(persona)) {
                        oldPersonaOfItemsListNewItems.getItemsList().remove(itemsListNewItems);
                        oldPersonaOfItemsListNewItems = em.merge(oldPersonaOfItemsListNewItems);
                    }
                }
            }
            for (Articulo articuloListNewArticulo : articuloListNew) {
                if (!articuloListOld.contains(articuloListNewArticulo)) {
                    Persona oldPersonaOfArticuloListNewArticulo = articuloListNewArticulo.getPersona();
                    articuloListNewArticulo.setPersona(persona);
                    articuloListNewArticulo = em.merge(articuloListNewArticulo);
                    if (oldPersonaOfArticuloListNewArticulo != null && !oldPersonaOfArticuloListNewArticulo.equals(persona)) {
                        oldPersonaOfArticuloListNewArticulo.getArticuloList().remove(articuloListNewArticulo);
                        oldPersonaOfArticuloListNewArticulo = em.merge(oldPersonaOfArticuloListNewArticulo);
                    }
                }
            }
            for (Actividades actividadesListNewActividades : actividadesListNew) {
                if (!actividadesListOld.contains(actividadesListNewActividades)) {
                    Persona oldPersonaOfActividadesListNewActividades = actividadesListNewActividades.getPersona();
                    actividadesListNewActividades.setPersona(persona);
                    actividadesListNewActividades = em.merge(actividadesListNewActividades);
                    if (oldPersonaOfActividadesListNewActividades != null && !oldPersonaOfActividadesListNewActividades.equals(persona)) {
                        oldPersonaOfActividadesListNewActividades.getActividadesList().remove(actividadesListNewActividades);
                        oldPersonaOfActividadesListNewActividades = em.merge(oldPersonaOfActividadesListNewActividades);
                    }
                }
            }
            em.getTransaction().commit();
        } catch (Exception ex) {
            String msg = ex.getLocalizedMessage();
            if (msg == null || msg.length() == 0) {
                Integer id = persona.getCodigopersona();
                if (findPersona(id) == null) {
                    throw new NonexistentEntityException("The persona with id " + id + " no longer exists.");
                }
            }
            throw ex;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void destroy(Integer id) throws IllegalOrphanException, NonexistentEntityException {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Persona persona;
            try {
                persona = em.getReference(Persona.class, id);
                persona.getCodigopersona();
            } catch (EntityNotFoundException enfe) {
                throw new NonexistentEntityException("The persona with id " + id + " no longer exists.", enfe);
            }
            List<String> illegalOrphanMessages = null;
            List<Estudiopersona> estudiopersonaListOrphanCheck = persona.getEstudiopersonaList();
            for (Estudiopersona estudiopersonaListOrphanCheckEstudiopersona : estudiopersonaListOrphanCheck) {
                if (illegalOrphanMessages == null) {
                    illegalOrphanMessages = new ArrayList<String>();
                }
                illegalOrphanMessages.add("This Persona (" + persona + ") cannot be destroyed since the Estudiopersona " + estudiopersonaListOrphanCheckEstudiopersona + " in its estudiopersonaList field has a non-nullable persona field.");
            }
            List<Carta> cartaListOrphanCheck = persona.getCartaList();
            for (Carta cartaListOrphanCheckCarta : cartaListOrphanCheck) {
                if (illegalOrphanMessages == null) {
                    illegalOrphanMessages = new ArrayList<String>();
                }
                illegalOrphanMessages.add("This Persona (" + persona + ") cannot be destroyed since the Carta " + cartaListOrphanCheckCarta + " in its cartaList field has a non-nullable persona field.");
            }
            List<Libros> librosListOrphanCheck = persona.getLibrosList();
            for (Libros librosListOrphanCheckLibros : librosListOrphanCheck) {
                if (illegalOrphanMessages == null) {
                    illegalOrphanMessages = new ArrayList<String>();
                }
                illegalOrphanMessages.add("This Persona (" + persona + ") cannot be destroyed since the Libros " + librosListOrphanCheckLibros + " in its librosList field has a non-nullable persona field.");
            }
            List<Items> itemsListOrphanCheck = persona.getItemsList();
            for (Items itemsListOrphanCheckItems : itemsListOrphanCheck) {
                if (illegalOrphanMessages == null) {
                    illegalOrphanMessages = new ArrayList<String>();
                }
                illegalOrphanMessages.add("This Persona (" + persona + ") cannot be destroyed since the Items " + itemsListOrphanCheckItems + " in its itemsList field has a non-nullable persona field.");
            }
            List<Articulo> articuloListOrphanCheck = persona.getArticuloList();
            for (Articulo articuloListOrphanCheckArticulo : articuloListOrphanCheck) {
                if (illegalOrphanMessages == null) {
                    illegalOrphanMessages = new ArrayList<String>();
                }
                illegalOrphanMessages.add("This Persona (" + persona + ") cannot be destroyed since the Articulo " + articuloListOrphanCheckArticulo + " in its articuloList field has a non-nullable persona field.");
            }
            List<Actividades> actividadesListOrphanCheck = persona.getActividadesList();
            for (Actividades actividadesListOrphanCheckActividades : actividadesListOrphanCheck) {
                if (illegalOrphanMessages == null) {
                    illegalOrphanMessages = new ArrayList<String>();
                }
                illegalOrphanMessages.add("This Persona (" + persona + ") cannot be destroyed since the Actividades " + actividadesListOrphanCheckActividades + " in its actividadesList field has a non-nullable persona field.");
            }
            if (illegalOrphanMessages != null) {
                throw new IllegalOrphanException(illegalOrphanMessages);
            }
            Unidadorganizacional unidadorganizacional = persona.getUnidadorganizacional();
            if (unidadorganizacional != null) {
                unidadorganizacional.getPersonaList().remove(persona);
                unidadorganizacional = em.merge(unidadorganizacional);
            }
            Tipo tipo = persona.getTipo();
            if (tipo != null) {
                tipo.getPersonaList().remove(persona);
                tipo = em.merge(tipo);
            }
            Quien quien = persona.getQuien();
            if (quien != null) {
                quien.setPersona(null);
                quien = em.merge(quien);
            }
            Persona personaRel = persona.getPersona();
            if (personaRel != null) {
                personaRel.getPersonaList().remove(persona);
                personaRel = em.merge(personaRel);
            }
            Pais pais = persona.getPais();
            if (pais != null) {
                pais.getPersonaList().remove(persona);
                pais = em.merge(pais);
            }
            Registro registro1 = persona.getRegistro1();
            if (registro1 != null) {
                registro1.setPersona(null);
                registro1 = em.merge(registro1);
            }
            List<Rol> rolList = persona.getRolList();
            for (Rol rolListRol : rolList) {
                rolListRol.getPersonaList().remove(persona);
                rolListRol = em.merge(rolListRol);
            }
            List<Premios> premiosList = persona.getPremiosList();
            for (Premios premiosListPremios : premiosList) {
                premiosListPremios.getPersonaList().remove(persona);
                premiosListPremios = em.merge(premiosListPremios);
            }
            List<Persona> personaList = persona.getPersonaList();
            for (Persona personaListPersona : personaList) {
                personaListPersona.setPersona(null);
                personaListPersona = em.merge(personaListPersona);
            }
            List<Programacion> programacionList = persona.getProgramacionList();
            for (Programacion programacionListProgramacion : programacionList) {
                programacionListProgramacion.setPersona(null);
                programacionListProgramacion = em.merge(programacionListProgramacion);
            }
            em.remove(persona);
            em.getTransaction().commit();
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public List<Persona> findPersonaEntities() {
        return findPersonaEntities(true, -1, -1);
    }

    public List<Persona> findPersonaEntities(int maxResults, int firstResult) {
        return findPersonaEntities(false, maxResults, firstResult);
    }

    private List<Persona> findPersonaEntities(boolean all, int maxResults, int firstResult) {
        EntityManager em = getEntityManager();
        try {
            CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
            cq.select(cq.from(Persona.class));
            Query q = em.createQuery(cq);
            if (!all) {
                q.setMaxResults(maxResults);
                q.setFirstResult(firstResult);
            }
            return q.getResultList();
        } finally {
            em.close();
        }
    }

    public Persona findPersona(Integer id) {
        EntityManager em = getEntityManager();
        try {
            return em.find(Persona.class, id);
        } finally {
            em.close();
        }
    }

    public int getPersonaCount() {
        EntityManager em = getEntityManager();
        try {
            CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
            Root<Persona> rt = cq.from(Persona.class);
            cq.select(em.getCriteriaBuilder().count(rt));
            Query q = em.createQuery(cq);
            return ((Long) q.getSingleResult()).intValue();
        } finally {
            em.close();
        }
    }

}
